From cda93d8096777bdf217ef7f69eed5cf87699e5f8 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Thu, 29 May 2014 20:35:09 -0700 Subject: [PATCH] Break up GitSource --- src/cargo/sources/git/mod.rs | 4 ++ src/cargo/sources/git/source.rs | 65 +++++++++++++++++++++ src/cargo/sources/{git.rs => git/utils.rs} | 68 ++-------------------- 3 files changed, 74 insertions(+), 63 deletions(-) create mode 100644 src/cargo/sources/git/mod.rs create mode 100644 src/cargo/sources/git/source.rs rename src/cargo/sources/{git.rs => git/utils.rs} (81%) diff --git a/src/cargo/sources/git/mod.rs b/src/cargo/sources/git/mod.rs new file mode 100644 index 000000000..f44594a28 --- /dev/null +++ b/src/cargo/sources/git/mod.rs @@ -0,0 +1,4 @@ +pub use self::utils::{GitRemote,GitDatabase,GitCheckout}; +pub use self::source::{GitSource}; +mod utils; +mod source; diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs new file mode 100644 index 000000000..f1c5db2cc --- /dev/null +++ b/src/cargo/sources/git/source.rs @@ -0,0 +1,65 @@ +use ops; +use core::source::Source; +use core::{NameVer,Package,Summary}; +use util::CargoResult; +use sources::git::utils::{GitReference,GitRemote,Master,Other}; +use std::fmt; +use std::fmt::{Show,Formatter}; + +pub struct GitSource { + remote: GitRemote, + reference: GitReference, + db_path: Path, + checkout_path: Path, + verbose: bool +} + +impl GitSource { + pub fn new(remote: GitRemote, reference: String, db: Path, checkout: Path, verbose: bool) -> GitSource { + GitSource { remote: remote, reference: GitReference::for_str(reference), db_path: db, checkout_path: checkout, verbose: verbose } + } +} + +impl Show for GitSource { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + try!(write!(f, "git repo at {}", self.remote.get_url())); + + match self.reference { + Master => Ok(()), + Other(ref reference) => write!(f, " ({})", reference) + } + } +} + +impl Source for GitSource { + fn update(&self) -> CargoResult<()> { + let repo = try!(self.remote.checkout(&self.db_path)); + try!(repo.copy_to(self.reference.as_slice(), &self.checkout_path)); + + Ok(()) + } + + fn list(&self) -> CargoResult> { + let pkg = try!(read_manifest(&self.checkout_path)); + Ok(vec!(pkg.get_summary().clone())) + } + + fn download(&self, _: &[NameVer]) -> CargoResult<()> { + Ok(()) + } + + fn get(&self, packages: &[NameVer]) -> CargoResult> { + let pkg = try!(read_manifest(&self.checkout_path)); + + if packages.iter().any(|nv| pkg.is_for_name_ver(nv)) { + Ok(vec!(pkg)) + } else { + Ok(vec!()) + } + } +} + +fn read_manifest(path: &Path) -> CargoResult { + let joined = path.join("Cargo.toml"); + ops::read_manifest(joined.as_str().unwrap()) +} diff --git a/src/cargo/sources/git.rs b/src/cargo/sources/git/utils.rs similarity index 81% rename from src/cargo/sources/git.rs rename to src/cargo/sources/git/utils.rs index f2bc69fdc..50a3c7c25 100644 --- a/src/cargo/sources/git.rs +++ b/src/cargo/sources/git/utils.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use url::Url; use util::{CargoResult,ProcessBuilder,io_error,human_error,process}; use std::fmt; @@ -8,12 +6,9 @@ use std::str; use std::io::{UserDir,AllPermissions}; use std::io::fs::{mkdir_recursive,rmdir_recursive,chmod}; use serialize::{Encodable,Encoder}; -use core::source::Source; -use core::{NameVer,Package,Summary}; -use ops; #[deriving(Eq,Clone,Encodable)] -enum GitReference { +pub enum GitReference { Master, Other(String) } @@ -43,58 +38,6 @@ impl Show for GitReference { } } -pub struct GitSource { - remote: GitRemote, - reference: GitReference, - db_path: Path, - checkout_path: Path, - verbose: bool -} - -impl GitSource { - pub fn new(remote: GitRemote, reference: String, db: Path, checkout: Path, verbose: bool) -> GitSource { - GitSource { remote: remote, reference: GitReference::for_str(reference), db_path: db, checkout_path: checkout, verbose: verbose } - } -} - -impl Show for GitSource { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - try!(write!(f, "git repo at {}", self.remote.url)); - - match self.reference { - Master => Ok(()), - Other(ref reference) => write!(f, " ({})", reference) - } - } -} - -impl Source for GitSource { - fn update(&self) -> CargoResult<()> { - let repo = try!(self.remote.checkout(&self.db_path)); - try!(repo.copy_to(self.reference.as_slice(), &self.checkout_path)); - - Ok(()) - } - - fn list(&self) -> CargoResult> { - let pkg = try!(read_manifest(&self.checkout_path)); - Ok(vec!(pkg.get_summary().clone())) - } - - fn download(&self, _: &[NameVer]) -> CargoResult<()> { - Ok(()) - } - - fn get(&self, packages: &[NameVer]) -> CargoResult> { - let pkg = try!(read_manifest(&self.checkout_path)); - - if packages.iter().any(|nv| pkg.is_for_name_ver(nv)) { - Ok(vec!(pkg)) - } else { - Ok(vec!()) - } - } -} macro_rules! git( ($config:expr, $verbose:expr, $str:expr, $($rest:expr),*) => ( @@ -212,9 +155,12 @@ impl GitRemote { GitRemote { url: url, verbose: verbose } } + pub fn get_url<'a>(&'a self) -> &'a Url { + &self.url + } + pub fn checkout(&self, into: &Path) -> CargoResult { if into.exists() { - // TODO: If the revision we have is a rev, avoid unnecessarily fetching if we have the rev already try!(self.fetch_into(into)); } else { try!(self.clone_into(into)); @@ -331,7 +277,3 @@ fn to_str(vec: &[u8]) -> String { str::from_utf8_lossy(vec).to_str() } -fn read_manifest(path: &Path) -> CargoResult { - let joined = path.join("Cargo.toml"); - ops::read_manifest(joined.as_str().unwrap()) -} -- 2.30.2